﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web.Configuration;
using dao.commons;
using dao.daos;
using negocio.commons;
using negocio.entidades;
using negocio.readOnly;

namespace negocio.servicios
{
    public class CompraService
    {
        public void RegistrarCompra(IList<ProductoForCompraReadOnly> productos, int idPedido)
        {
            SqlConnection conex = new SqlConnection();
            conex.ConnectionString = WebConfigurationManager.ConnectionStrings["StringConexion"].ConnectionString;
            SqlTransaction trans = null;
            try
            {
                conex.Open();
                trans = conex.BeginTransaction();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conex;
                cmd.Transaction = trans;
                string consulta = string.Format("Insert into COMPRA (ID_PEDIDO, FECHA, MONTO_TOTAL) values ({0}, '{1}', {2}); select @@identity;", idPedido, DateTime.Today.ToShortDateString(), GetMontoTotal(productos));
                cmd.CommandText = consulta;
                int compraId = Convert.ToInt32(cmd.ExecuteScalar());

                SqlCommand cmd2 = new SqlCommand();
                cmd2.Connection = conex;
                cmd2.Transaction = trans;

                SqlCommand cmd3 = new SqlCommand();
                cmd3.Connection = conex;
                cmd3.Transaction = trans;
                for (int i = 0; i < productos.Count; i++)
                {
                    consulta = string.Format("Insert into DETALLE_COMPRA (ID_COMPRA, ID_PRODUCTO, CANTIDAD, PRECIO_UNITARIO) values ({0}, {1}, {2}, {3})", compraId, productos[i].Id, productos[i].Cantidad, productos[i].PrecioCosto);
                    cmd2.CommandText =consulta;
                    cmd2.ExecuteNonQuery();

                    consulta = string.Format("update PRODUCTO set STOCK = (STOCK + {0}) where ID_PRODUCTO = {1}", productos[i].Cantidad, productos[i].Id);
                    cmd3.CommandText = consulta;
                    cmd3.ExecuteNonQuery();
                }

                SqlCommand cmd4 = new SqlCommand();
                cmd4.Connection = conex;
                cmd4.Transaction = trans;
                consulta = string.Format("Update PEDIDO set ID_ESTADO_PEDIDO = 2 where ID_PEDIDO = {0}", idPedido);
                cmd4.CommandText = consulta;
                cmd4.ExecuteNonQuery();

                trans.Commit();
            }
            catch (Exception)
            {
                if (trans != null)
                    trans.Rollback();
            }
            finally
            {
                if (conex.State == ConnectionState.Open)
                    conex.Close();
            }
        }

        private double GetMontoTotal(IList<ProductoForCompraReadOnly> productos)
        {
            double montoTotal = 0;
            for (int i = 0; i < productos.Count; i++)
            {
                montoTotal += productos[i].PrecioCosto * productos[i].Cantidad;
            }

            return montoTotal;
        }

        public List<CompraReadOnly> BuscarCompras(int idProveedor)
        {
            List<CompraReadOnly> lista = new List<CompraReadOnly>();
            CompraDao datos = new CompraDao();
            SqlDataReader dr = datos.ObtenerComprasXProveedor(idProveedor);
            while (dr.Read())
            {
                CompraReadOnly com = new CompraReadOnly();

                com.idCompra = dr["ID_COMPRA"].ToString();
                com.idPedido = dr["ID_PEDIDO"].ToString();
                com.monto = dr["MONTO_TOTAL"].ToString();
                com.fecha = Convert.ToDateTime(dr["FECHA"]).ToShortDateString();
                com.proveedor = dr["RAZON_SOCIAL"].ToString();

                lista.Add(com);
            }
            return lista;
        }

        public List<CompraReadOnly> BuscarCompras(string fD, string fH, int idProv)
        {
            List<CompraReadOnly> lista = new List<CompraReadOnly>();
            CompraDao datos = new CompraDao();
            SqlDataReader dr = datos.obtenerComprasXFecha(fD,fH, idProv);
            while (dr.Read())
            {
                CompraReadOnly com = new CompraReadOnly();

                com.idCompra = dr["ID_COMPRA"].ToString();
                com.idPedido = dr["ID_PEDIDO"].ToString();
                com.monto = dr["MONTO_TOTAL"].ToString();
                com.fecha = Convert.ToDateTime(dr["FECHA"]).ToShortDateString();
                com.proveedor = dr["RAZON_SOCIAL"].ToString();

                lista.Add(com);
            }
            return lista;
        }
    }
}
